import type { Metadata } from 'next'; import Link from 'next/link'; import { EnabledToggle, RunNowButton } from '@/components/admin/actions'; import { AdminError, AdminHeader, JsonInline, RunsTable, SectionTitle } from '@/components/admin/ui'; import { Pagination } from '@/components/ui/pagination'; import { adminApi, safeAdmin } from '@/lib/admin-api'; import { fmtAgo, fmtDateTime } from '@/lib/format'; export async function generateMetadata({ params }: { params: Promise<{ name: string }> }): Promise { const { name } = await params; return { title: `${name} runs` }; } export default async function AdminConnectorPage({ params, searchParams }: { params: Promise<{ name: string }>; searchParams: Promise<{ page?: string }> }) { const { name } = await params; const sp = await searchParams; const page = Math.max(1, Number(sp.page) || 1); const [runsRes, overviewRes] = await Promise.all([safeAdmin(adminApi.connectorRuns(name, page, 50)), safeAdmin(adminApi.overview())]); const connector = overviewRes.data?.data.connectors.find((c) => c.name === name) ?? null; const now = Date.now(); return ( <> {name}} lede={connector ? `${connector.source_name} · ${connector.description ?? ''}` : 'Connector runs and errors'} action={
{connector && } ← Overview
} /> {connector && (
Enabled
{connector.enabled ? 'yes' : 'no'}
Last success
{fmtAgo(connector.last_success_at, now)}
Last attempt
{fmtAgo(connector.last_attempt_at, now)}
Next run
{fmtDateTime(connector.next_run_at)}
Config
)} {runsRes.error !== null ? (
) : ( <> Runs `/admin/connectors/${encodeURIComponent(name)}?page=${p}`} /> Recent errors {runsRes.data.errors.length === 0 ? (

No errors recorded

) : (
    {runsRes.data.errors.map((e) => (
  • {fmtAgo(e.occurred_at, now)} {e.error_type ?? 'Error'} {e.message ?? '—'} {e.run_id && {e.run_id}} {e.context && }
  • ))}
)} )} ); }